package com.mall.common.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.criteria.CriteriaQuery;

import com.mall.common.bean.Order;
import com.mall.common.bean.Pager;
import com.mall.common.bean.SearchFilter;
import com.mall.common.hibernate.Finder;

/**
 * Dao接口 - Dao基接口
 */
public interface BaseDao<T, PK extends Number> {


	public Class<T> getEntityClass();

	public EntityManager getEntityManager();
	/**
	 * 根据ID获取实体对象.
	 *
	 * @param id
	 *            记录ID
	 * @return 实体对象
	 */
	public T find(Number id);

	/**
	 * 根据ID数组获取实体对象集合.
	 *
	 * @param ids
	 *            ID对象数组
	 *
	 * @return 实体对象集合
	 */
	public List<T> get(Number[] ids);

	public List<T> get(String[] ids);

	/**
	 * 根据属性名和属性值获取实体对象.
	 *
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象
	 */
	public T get(String propertyName, Object value);

	/**
	 * 根据属性名和属性值获取实体对象集合.
	 *
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            属性值
	 * @return 实体对象集合
	 */
	public List<T> getList(String propertyName, Object value);

	/**
	 * 根据属性名和属性值模糊查找实体对象集合.
	 * @param propertyName
	 * @param value
	 * @param module
	 * @return
	 */
	public List<T> getListLike(String propertyName, String value, Integer module);

	/**
	 * 根据实体ID列表加载实体.
	 * @param ids
	 *         实体ID集合
	 * @return 实体对象集合
	 */
	public List<T> getList(Long[] ids);

	/**
	 * 获取所有实体对象集合.
	 *
	 * @return 实体对象集合
	 */
	public List<T> getAll();

	/**
	 * 获取所有实体对象总数.
	 *
	 * @return 实体对象总数
	 */
	public Long getTotalCount();

	/**
	 * 根据属性名、修改前后属性值判断在数据库中是否唯一(若新修改的值与原来值相等则直接返回true).
	 *
	 * @param propertyName
	 *            属性名称
	 * @param oldValue
	 *            修改前的属性值
	 * @param oldValue
	 *            修改后的属性值
	 * @return boolean
	 */
	public boolean isUnique(String propertyName, Object oldValue, Object newValue);

	/**
	 * 根据属性名判断数据是否已存在.
	 *
	 * @param propertyName
	 *            属性名称
	 * @param value
	 *            值
	 * @return boolean
	 */
	public boolean isExist(String propertyName, Object value);


	public int countQueryResult(Finder finder);

	public abstract List<T> findList(Integer first, Integer count, List<SearchFilter> filters, List<Order> orders);

	public abstract List<T> findList(CriteriaQuery<T> criteriaquery, Integer firstResult,
			Integer maxResults, List<SearchFilter> filterList, List<Order> orderList);

	public abstract Pager findPage(Pager pager);

	/**
	 * 通过Finder获得分页数据
	 *
	 * @param finder
	 *            Finder对象
	 * @param pageNo
	 *            页码
	 * @param pageSize
	 *            每页条数
	 * @return
	 */
	public Pager findByPager(Pager pager, Finder finder);

	public Pager findByPager(CriteriaQuery<T> criteriaQuery, Pager pager);

	public abstract long count(SearchFilter[] afilter);

	public abstract void persist(T entity);

	public abstract T merge(T entity);

	public abstract void remove(Number id);

	public abstract void remove(T entity);

	public abstract void refresh(T entity);

	public abstract Number getIdentifier(T entity);

	public abstract boolean isManaged(T entity);

	public abstract void detach(T entity);

	public abstract void lock(T entity, LockModeType lockmodetype);

	public abstract void clear();

	public abstract void flush();

	public Pager findByPagerForHessian(Pager pager, Finder finder);
}